/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package contatos.presenter;

import contatos.collection.Contatos;
import contatos.model.Contato;
import contatos.patterns.observer.Observer;
import contatos.patterns.strategy.GraficoBarraStrategy;
import contatos.patterns.strategy.GraficoColunaStrategy;
import contatos.patterns.strategy.IGraficoStrategy;
import contatos.view.GraficoView;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.TreeSet;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 *
 * @author felipe
 */
public class GraficoPresenter implements Observer {

    private GraficoView view;
    private IGraficoStrategy strategy;
    private TreeSet<Contato> contatos;
    private JFrame frame;

    public GraficoPresenter(TreeSet<Contato> lista) {
        view = new GraficoView();
        this.contatos = lista;

        //botao ok
        view.getBtnOk().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                criarGrafico();
            }
        });

        //botao fechar
        view.getBtnFechar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                view.setVisible(false);
                view.dispose();
            }
        });

        //criando um novo frame para ser a tela do grafico
        frame = new JFrame("Grafico de colunas");
        frame.setSize(new Dimension(800, 600));
        frame.setLocationRelativeTo(view);

        view.setVisible(true);
    }

    private void criarGrafico() {
        try {
            switch (view.getCbGrafico().getSelectedIndex()) {
                case -1:
                    throw new Exception("Selecione como o gráfico será gerado");
                case 0:
                    strategy = new GraficoColunaStrategy();
                    break;
                case 1:
                    strategy = new GraficoBarraStrategy();
                    break;
            }

            TreeSet<String> estados = new TreeSet<String>();
            TreeSet<String> operadoras = new TreeSet<String>();
            for (Contato contato : contatos) {
                estados.add(contato.getUf());
                operadoras.add(contato.getOperadora());
            }

            //gerando os dados de acordo com a uf
            int quantidadeOperadora = 0;
            DefaultCategoryDataset ds = new DefaultCategoryDataset();
            for (String estado : estados) {
                for (String operadora : operadoras) {
                    for (Contato contato : contatos) {
                        if (contato.getUf().equals(estado) && contato.getOperadora().equals(operadora)) {
                            quantidadeOperadora++;
                        }
                    }
                    ds.addValue(quantidadeOperadora, operadora, estado);
                    quantidadeOperadora = 0;
                }
            }

            JFreeChart grafico = strategy.gerarGrafico(ds);

            //criando um panel com o grafico
            ChartPanel panel = new ChartPanel(grafico);
            panel.setPreferredSize(new Dimension(800, 600));

            //adicionando o grafico ao frame
            frame.getContentPane().removeAll();
            frame.add(panel);
            panel.setVisible(true);
            frame.setVisible(true);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(view, e.getMessage());
        }
    }

    @Override
    public void update(Contatos pessoas) {
        contatos = pessoas.getCompletos();
        criarGrafico();
    }
}
